'''魔方阵又称纵横图,是一种n行n列,由自然数1~n*n组成的方阵,该方阵中的数符合以下规律
   (1)方阵中每个元素都不相等
   (2)每行,每列以及主,副对角线上的元素之和都相等
   本案例要求编写程序,输出一个5行5列的魔方阵'''
# n = 5
# # 5*5二维列表
# magic_square  = [[0 for x in range(n)] for y in range(n)]
# i = n/2
# j = n-1
# num = 1
# while num <= (n*n):
#     if i == -1 and j == n:
#         j = n - 2
#         i = 0
#     else:
#         if j == n:
#            j = 0
#         if i < 0:
#            i = n - 1
#     if magic_square[int(i)][int(j)]:
#         j = j - 2
#         i = i + 1
#         continue
#     else:
#         magic_square[int(i)][int(j)] = num
#         num = num + 1
#     j = j + 1
#     i = i - 1
# for i in range(0,n):
#     for j in range(0,n):
#         print('%2d' % (magic_square[i][j]),end=' ')
#         if j == n - 1:
#             print()
# n = 5
# magic_square = [[0 for x in range(n)] for y in range(n)]  # 创建5x5的二维零矩阵
# i = n / 2  # ❗问题点：初始行坐标应为0（罗伯法要求从第一行中间开始）
# j = n - 1  # ❗问题点：初始列坐标应为n//2=2（中间列），这里取4会导致错误起始位置
# num = 1  # 从数字1开始填充
#
# while num <= (n * n):  # 填充1~25所有数字
#     # 边界条件处理
#     if i == -1 and j == n:  # 当同时超出左上边界时
#         j = n - 2  # 移动到倒数第二列
#         i = 0  # 首行
#     else:
#         if j == n:  # 列超出右边界
#             j = 0  # 循环到第一列
#         if i < 0:  # 行超出上边界
#             i = n - 1  # 循环到最后一行
#
#     # ❗问题点：int()转换会导致i=2.5变成2，但初始坐标应为整数
#     if magic_square[int(i)][int(j)]:  # 检查目标位置是否已被占用
#         j = j - 2  # 被占用则向右移动两列（实际会越界）
#         i = i + 1  # 向下移动一行
#         continue  # 跳过本次循环
#     else:
#         magic_square[int(i)][int(j)] = num  # 填入数字
#         num += 1  # 数字递增
#
#     j = j + 1  # 常规移动：向右一列
#     i = i - 1  # 常规移动：向上一行
#
# # 打印输出
# for i in range(0, n):
#     for j in range(0, n):
#         print('%2d' % (magic_square[i][j]), end=' ')
#     print()

n = 5  # 魔方阵阶数
magic_square = [[0] * n for _ in range(n)]

# 初始化起始位置（第一行中间）
row, col = 0, n // 2 # row取0,col取n//2 (//整除:使两个操作数相除,取商的整数部分)

for num in range(1, n * n + 1):
    magic_square[row][col] = num

    # 计算下一个位置（右上方）
    next_row = (row - 1) % n  #(%取余:使两个操作数相除取余数) 若row = -1 则结果为n-1
    next_col = (col + 1) % n  # 若col = -1 则结果为n-1

    # 如果目标位置已被占据，则下移一行
    if magic_square[next_row][next_col] != 0:
        row = (row + 1) % n
    else:
        row, col = next_row, next_col

# 打印魔方阵
print("5x5魔方阵：")
for r in magic_square:
    print(" ".join(f"{num:2d}" for num in r))

print( -1 % 5)
print( 5 % 5)
print( 12 % 3)